﻿#include "队列.h"

#include <stdio.h>
#include <stdlib.h>

队列_结构* 构造_队列(const int 总长)
{
    队列_结构 *队列 = malloc(sizeof(队列_结构));
    队列->数据 = calloc(总长+1,sizeof(队列数据类型));
    队列->队头 = 0;
    队列->队尾 = 0;
    队列->总长度 = 总长+1;
    return 队列;
}

void 销毁_队列(队列_结构* 队列)
{
    free(队列->数据);
    free(队列);
}

void 数据入队(队列_结构* 队列, const 队列数据类型 数据)
{
    if(队列满了(队列))
    {
        perror("队列满了，别再入队了！");
        return;
    }
    队列->数据[队列->队尾] = 数据;
    队列->队尾 = (队列->队尾+1) % 队列->总长度;
}

队列数据类型 数据出队(队列_结构* 队列)
{
    if(队列空了(队列))
    {
        perror("队列空了，别再出队了");
        return -1;
    }
    const 队列数据类型 数据 = 队列->数据[队列->队头];
    队列->队头 = (队列->队头+1) % 队列->总长度;
    return 数据;
}

bool 队列满了(const 队列_结构* 队列)
{
    return (队列->队尾+1) % 队列->总长度 == 队列->队头;
}

bool 队列空了(const 队列_结构* 队列)
{
    return 队列->队头 == 队列->队尾;
}

void 打印队列(const 队列_结构* 队列)
{
    const int 队头 = 队列->队头;
    const int 队尾 = 队列->队尾;
    
    for (int i = 队列->总长度 - 1;i>=0;i--)
    {
        const char *队字符串 = "%6s|  %-6d|%6s\n";
        if(i == 队尾)
        {
            printf_s(队字符串,"队尾->",队列->数据[i],"");
        }
        else if(i == 队头)
        {
            printf_s(队字符串,"",队列->数据[i],"<-队头");
        }
        else
        {
            printf_s(队字符串,"",队列->数据[i],"");
        }
    }
    printf_s("--------------------------\n");
}
